#include "Queue.h"

// 初始化队列
void QueueInit(Queue* q)
{
    assert(q);
    q->_front = NULL;
    q->_rear = NULL;
    q->size = 0;
}

// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{
    assert(q);
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    if(newnode == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    newnode->_data = data;
    newnode->_pNext = NULL;

    if(q->size == 0)//无数据
    {
        q->_front = newnode;
        q->_rear = newnode;
    }
    else//有数据，尾插
    {
        q->_rear->_pNext = newnode;
        q->_rear = newnode;
    }

    q->size++;//更新数据的有效个数
}

// 队头出队列
void QueuePop(Queue* q)
{
    assert(q);
    assert(q->size > 0);
    QNode* del = q->_front;
    q->_front = del->_pNext;
    free(del);
    q->size--;
}

// 获取队列头部元素
QDataType QueueFront(Queue* q)
{
    assert(q);
    assert(q->size > 0);//检查是否有数据
    return q->_front->_data;
}

// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{
    assert(q);
    assert(q->size > 0);//检查是否有数据
    return q->_rear->_data;
}

// 获取队列中有效元素个数
int QueueSize(Queue* q)
{
    assert(q);
    return q->size;
}

// 检测队列是否为空，如果为空返回非零结果，如果非空返回0 
int QueueEmpty(Queue* q)
{
    assert(q);
    return q->size == 0;
}

// 销毁队列
void QueueDestroy(Queue* q)
{
    assert(q);
    while(q->size)
    {
        QueuePop(q);
    }
    q->_front = NULL;
    q->_rear = NULL;
    q->size = 0;//可以不写
}

